; void productoMatrizVector(unsigned short* A, unsigned short* v, unsigned short n, unsigned short m, unsigned int* w);

global productoMatrizVector

%define ptr_A [ebp + 8]
%define ptr_v [ebp + 12]
%define n [ebp + 16]
%define m [ebp + 20]
%define ptr_w [ebp +24]
%define acum [ebp - 4]

section .text

productoMatrizVector:
	push ebp
	mov ebp, esp
	sub esp, 4
	push esi
	push edi
	push ebx
	
	mov edi, ptr_A ; Muevo a edi el puntero a la matriz A.
	mov esi, ptr_v ; Muevo a esi el puntero al vector v.
	
	xor ebx, ebx ; Indice de columnas.
	xor ecx, ecx ; Indice de filas.
	
ciclo_filas:
	mov dword acum, 0 ; Limpio el acumulador.
	
ciclo_columnas:
	mov ax, [edi + 2 * ebx]
	mul word [esi + 2 * ebx]
	shl edx, 16
	mov dx, ax
	add acum, edx
	
	inc bx
	cmp bx, n
	jne ciclo_columnas
	
	mov eax, acum
	mov edx, ptr_w
	mov [edx + 4 * ecx], eax
	lea edi, [edi + 2 * ebx]
	
	xor ebx, ebx
	
	inc cx
	cmp cx, m
	jne ciclo_filas
	
fin:
	pop ebx
	pop edi
	pop esi
	add esp, 4
	pop ebp
	ret
